function [U, V, obj, iter] = localopt(U, V, row, col, val, m, n, lambda, grad )

X = cat(1, U, V);
lb = -1e+9*ones(size(X));
ub = +1e+9*ones(size(X));

% max number of iterations
param.maxIter = 200;    
% max number of calling the function
param.maxFnCall = 200;  
% tolerance of constraint satisfaction
param.relCha = 1e+5;      
% final objective function accuracy parameter
param.tolPG = 1e-3;   
% stored gradients
param.m = 1;

callfunc = @(A) bgfsBoost( A, row, col, val, m, n, lambda, grad );

[X, obj, iter] = lbfgsb(X,lb,ub,callfunc, [], [], param);

U = X(1:m, :);
V = X(m + 1:end, :);

end
